SF3B1 iCLIP analysis

Binding site coverage profiles

Author
Affiliation
Dr. Mirko Brueggemann

Buchman Institute for Molecular Life Sciences

Published

September 19, 2023

1 Analysis Description

Compute iCLIP meta profiles around genomic landmarks. In total four libraries are used and compared: SF3B1-WT, SF3B1-MUT, U2AF2-WT, SF3B1-WT-eCLIP (all in K562). As genomic landmarks, annotated splice sites and predicted branchpoints are used.

2 Load libraries

Show code
library(readr)
library(circlize)
library(patchwork)
library(ggsci)
library(ggnewscale)
library(knitr)
library(grid)
library(gridGraphics)
library(gridExtra)
library(scales)
library(reshape2)
library(ggplot2)
library(rtracklayer)
library(GenomicFeatures)
library(GenomicAlignments)
library(viridis)
library(tibble)
library(dplyr)
library(tidyr)
library(ComplexHeatmap)
library(kableExtra)
library(GenomicRanges)
library(BindingSiteFinder)
library(ggnewscale)
library(ggVennDiagram)
library(branchpointer)
library(BSgenome.Hsapiens.UCSC.hg38)
Show code
source("../styles.R")
source("../helper.R")

3 Data preparation

For all comparisons the iCLIP signal is shown as the mean of means (mean of replicates and mean over respective ranges). No direct correction for library size was computed, since all replicates in the SF3B1 dataset were downsampled to the smallest sample. Thus profiles of the SF3B1 MUT and WT conditions can be compared directly. This is not possible for the U2AF2 or SF3B1-eCLIP dataset, which can only be evaluated from a positional point of view. In all profiles rows with only zeros (no iCLIP crosslinks) were removed.

Show code
load("/Users/mirko/Projects/Annotations/human/gencode_36/filtered/gencode_v36_filtered.rda")
anno.db = loadDb("/Users/mirko/Projects/Annotations/human/gencode_36/filtered/gencode_v36_filtered.sqlite")
gns = genes(anno.db)
idx = match(gns$gene_id, anno$gene_id)
elementMetadata(gns) = cbind(elementMetadata(gns), elementMetadata(anno)[idx,])
Show code
rngEnd = readRDS("../01_splicingMaps/data/rngEnd.rds")
# Load clip data SF3B1 WT
clipFilesWt = "/Users/mirko/Projects/sf3b1/01_data_subsamp/wt/cov/replicate"
clipFiles = c(clipFilesWt)
clipFiles = list.files(clipFiles, pattern = ".bw$", full.names = TRUE)
clipFilesP = clipFiles[grep(clipFiles, pattern = "Plus")]
clipFilesM = clipFiles[grep(clipFiles, pattern = "Minus")]
# Organize clip data in dataframe
colData = data.frame(
  id = 1:3,
  condition = factor(c("WT", "WT", "WT")),
  clPlus = clipFilesP,
  clMinus = clipFilesM)
bdsSF3B1_WT = BSFDataSetFromBigWig(ranges = rngEnd, meta = colData)

# Load clip data SF3B1 MUT
clipFilesMut = "/Users/mirko/Projects/sf3b1/01_data_subsamp/mut/cov/replicate"
clipFiles = c(clipFilesMut)
clipFiles = list.files(clipFiles, pattern = ".bw$", full.names = TRUE)
clipFilesP = clipFiles[grep(clipFiles, pattern = "Plus")]
clipFilesM = clipFiles[grep(clipFiles, pattern = "Minus")]
# Organize clip data in dataframe
colData = data.frame(
  id = 1:2,
  condition = factor(c("MUT", "MUT")),
  clPlus = clipFilesP,
  clMinus = clipFilesM)
bdsSF3B1_MUT = BSFDataSetFromBigWig(ranges = rngEnd, meta = colData)

# Load clip data U2AF65 WT
clipFilesWt = "/Users/mirko/Projects/BindingSiteStrength/01_data/05_U2AF65_cellLines/K562/cov/replicates/"
clipFiles = c(clipFilesWt)
clipFiles = list.files(clipFiles, pattern = ".bw$", full.names = TRUE)
clipFilesP = clipFiles[grep(clipFiles, pattern = "plus")]
clipFilesM = clipFiles[grep(clipFiles, pattern = "minus")]
# Organize clip data in dataframe
colData = data.frame(
  id = 1:4,
  condition = factor(rep("WT",4)),
  clPlus = clipFilesP,
  clMinus = clipFilesM)
# creating objects and importing clip siganl
bdsU2AF2_WT = BSFDataSetFromBigWig(ranges = rngEnd, meta = colData)

# Load eclip data SF3B1 WT
clipFilesWt = "/Users/mirko/Projects/sf3b1/04_eCLIP/sf3b1/"
clipFiles = c(clipFilesWt)
clipFiles = list.files(clipFiles, pattern = ".bw$", full.names = TRUE)
clipFilesP = clipFiles[grep(clipFiles, pattern = "plus")]
clipFilesM = clipFiles[grep(clipFiles, pattern = "minus")]
# Organize clip data in dataframe
colData = data.frame(
  id = 1:2,
  condition = factor(rep("WT",2)),
  clPlus = clipFilesP,
  clMinus = clipFilesM)
# creating objects and importing clip siganl
bdsSF3B1_ECLIP = BSFDataSetFromBigWig(ranges = rngEnd, meta = colData)

clipData = list(bdsSF3B1_WT = bdsSF3B1_WT, 
                bdsSF3B1_MUT = bdsSF3B1_MUT, 
                bdsU2AF2_WT = bdsU2AF2_WT,
                bdsSF3B1_ECLIP = bdsSF3B1_ECLIP)

3.1 Splice sites

Show code
# ------------------------------------------------------------------------------
# get all introns from annotation
# ------------------------------------------------------------------------------
intrns = intronsByTranscript(anno.db) %>% unlist()
exn = exons(anno.db, use.names = TRUE)

# ------------------------------------------------------------------------------
# match 3'SS
# ------------------------------------------------------------------------------
# -> note:  additional matching step with positions from introns is needed to have 
#           exon_ids for each splice sites, which allows machting with branchpoint
#           prediction later on
exn3pos = flank(unique(resize(exn, fix = "start", width = 1)), width = 1, start = TRUE)
int3pos = unique(resize(intrns, fix = "end", width = 1))
ss3Anno = subsetByOverlaps(exn3pos, int3pos)

# ------------------------------------------------------------------------------
# match 5'SS
# ------------------------------------------------------------------------------
exn5pos = flank(unique(resize(exn, fix = "end", width = 1)), width = 1, start = FALSE)
int5pos = unique(resize(intrns, fix = "start", width = 1))
ss5Anno = subsetByOverlaps(exn5pos, int5pos)

Annotated splice sites were extracted as all unique start/ end positions from exons in the GENCODE v36 annotation. In total this resulted in 253,512 3’SS and 257,261 5’SS. Please note that the number of 3’/ 5’ splice sites is not identical, since multiple 3’SS can relate to the same 5’SS and vice versa.

3.2 Branchpoint predictions

Show code
pred = readRDS("./data/pred.rds")
names(pred) = 1:length(pred)

predSelAll = pred %>% 
  as.data.frame() %>%
  group_by(exon_id) %>%
  filter(branchpoint_prob == max(branchpoint_prob))

predSel = pred %>% 
  as.data.frame() %>%
  group_by(exon_id) %>%
  filter(branchpoint_prob > 0.52) %>%
  mutate(nBps = n()) %>%
  filter(branchpoint_prob == max(branchpoint_prob))

bpPred = GRanges(seqnames = predSel$seqnames,
                 ranges = IRanges(start = predSel$test_site, width = 1),
                 strand = predSel$strand,
                 gene_id = predSel$gene_id,
                 gene_type = predSel$gene_type,
                 exon_id = predSel$exon_id,
                 to_3prime_point = predSel$to_3prime_point,
                 to_5prime_point = predSel$to_5prime_point,
                 ppt_run_length = predSel$ppt_run_length,
                 U2_binding_energy = predSel$U2_binding_energy,
                 branchpoint_prob = predSel$branchpoint_prob,
                 nBps = predSel$nBps
                 )

Branchpoints were again predicted by branchpointer, for each splice site in the annotation. Specifically, we extracted exons from protein coding genes annotated in GENCODE v36 were selected as seed to span an intronic search window of 27nt ranging from -18 to -44 from the 3’ splice site. For each region the highest scoring branchpoint was selected, based on the ‘branchpoint probability’. From these, significant branchpoints were selected based on a ‘branchpoint probability’ cutoff of 0.52 (recommended default). This resulted in 196,855 significant branchpoints.

3.3 Overlaps

To achieve comparability between the two splice site and the branchpoint prediction set, we reduced each set to the union of all three, using the exon_id as matching identifier. This results in a set of 93.679 exons, represented by a single 3’SS, 5’SS and branchpoint.

Show code
l = list(
    spliceSites3 = unique(names(ss3Anno)),
    spliceSites5 = unique(names(ss5Anno)),
    branchpoints = bpPred$exon_id)
exnIntersectionIDs = Reduce(intersect, l)
ggVennDiagram(l, category.names = c("3'SS", "5'SS", "BP")) +
    labs(title = "Exon union") +
    scale_fill_viridis(option = "B") +
    scale_color_aaas()

Intersection of annotated splice sites and predicted branchpoints

4 Coverage profiles at landmarks

Meta profiles of SF3B1 WT and MUT with additional eCLIP of SF3B1 and iCLIP of U2AF2 confirmes the double-peak binding pattern of SF3B1.

Show code
makeDfPlotAll <- function(x, w, name, rngSs3, rngSs5, rngBp) {
  # set frame
  f3ss = rngSs3 + w
  f5ss = rngSs5 + w
  fbp = rngBp + w
  
  # calc 3'ss
  currObj = setRanges(x, f3ss)
  currCov = coverageOverRanges(currObj, returnOptions = "merge_all_replicates", method = "mean")
  currCov = currCov[rowSums(currCov) > 0,] # This removes rows with all zeros !
  # sum up coverage
  df1Cov = data.frame(pos = -w:w, mean = colMeans(currCov), type = "3'SS", data = name) 
  
  # calc 5'ss
  currObj = setRanges(x, f5ss)
  currCov = coverageOverRanges(currObj, returnOptions = "merge_all_replicates", method = "mean")
  currCov = currCov[rowSums(currCov) > 0,] # This removes rows with all zeros !
  # sum up coverage
  df2Cov = data.frame(pos = -w:w, mean = colMeans(currCov), type = "5'SS", data = name) 
  
  # calc bp
  currObj = setRanges(x, fbp)
  currCov = coverageOverRanges(currObj, returnOptions = "merge_all_replicates", method = "mean")
  currCov = currCov[rowSums(currCov) > 0,] # This removes rows with all zeros !
  # sum up coverage
  df3Cov = data.frame(pos = -w:w, mean = colMeans(currCov), type = "BP", data = name) 

  # make return  
  dfCov = rbind(df1Cov, df2Cov, df3Cov)
  d = list(dfCov = dfCov)
  return(d)
}

ss3Intersect = ss3Anno[names(ss3Anno) %in% exnIntersectionIDs]
ss5Intersect = ss5Anno[names(ss5Anno) %in% exnIntersectionIDs]
bpIntersect = bpPred[bpPred$exon_id %in% exnIntersectionIDs]

d1 = makeDfPlotAll(x = clipData$bdsSF3B1_WT, w = 100, name = "SF3B1-WT", rngSs3 = ss3Intersect, rngSs5 = ss5Intersect, rngBp = bpIntersect)
d2 = makeDfPlotAll(x = clipData$bdsSF3B1_MUT, w = 100, name = "SF3B1-MUT", rngSs3 = ss3Intersect, rngSs5 = ss5Intersect, rngBp = bpIntersect)
d3 = makeDfPlotAll(x = clipData$bdsU2AF2_WT, w = 100, name = "U2AF2", rngSs3 = ss3Intersect, rngSs5 = ss5Intersect, rngBp = bpIntersect)
d4 = makeDfPlotAll(x = clipData$bdsSF3B1_ECLIP, w = 100, name = "SF3B1-eCLIP", rngSs3 = ss3Intersect, rngSs5 = ss5Intersect, rngBp = bpIntersect)

dfCov = rbind(d1$dfCov,d2$dfCov,d3$dfCov,d4$dfCov)
dfCov$type = factor(dfCov$type, levels = c("BP", "3'SS", "5'SS"))
dfCov$data = factor(dfCov$data, levels = c("SF3B1-WT", "SF3B1-MUT", "U2AF2", "SF3B1-eCLIP"))

dfCov1 = dfCov %>% filter(pos %in% c(-100:50) & type == "3'SS" | pos %in% c(-50:100) & type == "5'SS" | pos %in% c(-50:50) & type == "BP")


ggplot(dfCov1, aes(x = pos, y = mean, color = data)) +
    geom_line(size = 1) +
    facet_grid(data~type, scales = "free") +
    theme_nice() +
    theme(legend.position = "none") +
    scale_color_npg() +
    labs(
        x = "Position relative to BP and splice site (nt)",
        y = "Mean iCLIP signal"
    )

Coverage profiles

4.1 Additional details

Show code
bpIntersect = bpPred[bpPred$exon_id %in% exnIntersectionIDs]
bpIntersect$nBps2 = ifelse(bpIntersect$nBps > 4, 4, bpIntersect$nBps)

df = bpIntersect$nBps %>%
  table() %>%
  as.data.frame() %>%
  rename('#BP' = '.')

ggplot(df, aes(x = `#BP`, y = Freq, fill = `#BP`)) +
  geom_col(position = "dodge") +
  scale_fill_viridis(option = "rocket", discrete = TRUE) +
  theme_pub() +
  theme(legend.position = "top") 

Frequency of multiple branchpoint predicitons per region

Show code
makeDfPlotAll <- function(x, w, name, set) {
  # set frame
  f3ss = set + w
  # calc bp
  currObj = setRanges(x, f3ss)
  currCov = coverageOverRanges(currObj, returnOptions = "merge_all_replicates", method = "mean")
  currCov = currCov[rowSums(currCov) > 0,] # This removes rows with all zeros !
  df1Cov = data.frame(pos = -w:w, mean = colMeans(currCov), type = "3'SS", data = name) 
  # make return  
  dfCov = rbind(df1Cov)
  d = list(dfCov = dfCov)
  return(d)
}

bpIntersect = bpPred[bpPred$exon_id %in% exnIntersectionIDs]
bpIntersect$nBps2 = ifelse(bpIntersect$nBps > 4, 4, bpIntersect$nBps)
bpList = split(bpIntersect, bpIntersect$nBps2)

d = lapply(bpList, function(x){
  d1 = makeDfPlotAll(x = clipData$bdsSF3B1_WT, w = 100, name = "SF3B1-WT", set = x)
  d2 = makeDfPlotAll(x = clipData$bdsSF3B1_MUT, w = 100, name = "SF3B1-MUT", set = x)
  d3 = makeDfPlotAll(x = clipData$bdsU2AF2_WT, w = 100, name = "U2AF2", set = x)
  d4 = makeDfPlotAll(x = clipData$bdsSF3B1_ECLIP, w = 100, name = "SF3B1-eCLIP", set = x)
  dfCov = rbind(d1$dfCov,d2$dfCov,d3$dfCov,d4$dfCov)
  dfCov$type = factor(dfCov$type, levels = c("3'SS", "5'SS"))
  dfCov$data = factor(dfCov$data, levels = c("SF3B1-WT", "SF3B1-MUT", "U2AF2", "SF3B1-eCLIP"))
  return(dfCov)
})
df = dplyr::bind_rows(d, .id = "variable")

ggplot(df, aes(x = pos, y = mean, color = variable)) +
  geom_line() +
  facet_wrap(~data, scales = "free", ncol = 2) +
  theme_nice() +
  theme(legend.position = "right") +
  scale_color_npg() +
  xlim(-50,50)

Coverage profiles split by the number of significant branchpoint predictions.

Show code
ggplot(df, aes(x = pos, y = mean, color = variable)) +
  geom_line() +
  facet_grid(data~variable, scales = "free") +
  theme_nice() +
  theme(legend.position = "none") +
  scale_color_npg() +
  xlim(-50, 50)

Coverage profiles split by the number of significant branchpoint predictions.

5 Coverage profiles at landmarks WT vs MUT

The meta-profiles between SF3B1 WT and MUT differed at the second peak of the double-peak shape profile. This difference was tested systematically for each position in the indicated window using a T-Test. This tests for the mean difference between the two curves. Each splice site was used as center to span a symmetrical window of 401 nt. Each position in this window was tested separately (T-Test) and resulting P values were Benjamini-Hochberg corrected. Positions below a cutoff of P adjusted <= 0.01 were selected as significantly different.

Show code
d = makeCoverageAndCompare(x = clipData$bdsSF3B1_WT, y = clipData$bdsSF3B1_MUT,
                   Xname = "SF3B1-WT", Yname = "SF3B1-MUT", w = 100,
                   rngSs3 = ss3Intersect, rngSs5 = ss5Intersect, rngBp = bpIntersect)
d$dfTest$sig = ifelse(d$dfTest$pAdj < 0.01, TRUE, FALSE)
d$dfTest$type = factor(d$dfTest$type, levels = c("BP", "3'SS", "5'SS"))
d$dfCov$type = factor(d$dfCov$type, levels = c("BP", "3'SS", "5'SS"))

dfCov1 = d$dfCov %>% filter(pos %in% c(-100:50) & type == "3'SS" | pos %in% c(-50:100) & type == "5'SS" | pos %in% c(-50:50) & type == "BP")
dfTest1 = d$dfTest %>% filter(pos %in% c(-100:50) & type == "3'SS" | pos %in% c(-50:100) & type == "5'SS" | pos %in% c(-50:50) & type == "BP")

ggplot() +
    geom_line(data = dfCov1, aes(x = pos, y = mean, color = data)) +
    scale_color_npg() +
    ggnewscale::new_scale_color() +
    geom_point(data = subset(dfTest1, sig == FALSE), aes(x = pos, y = -.05, color = sig), size = 4, shape = 73, stroke = 3) +
    geom_point(data = subset(dfTest1, sig == TRUE), aes(x = pos, y = -.01, color = sig), size = 4, shape = 73, stroke = 3) +
    scale_color_brewer(palette = "Dark2", direction = -1) +
    facet_wrap(~type, scales = "free") +
    theme_nice() +
    theme(legend.position = "top") +
    labs(
        x = "Position relative to genomic landmark",
        y = "Crosslinks (mean of means)"
    )

Coverage profiles comparisson of SF3B1 WT and MUT signal

5.1 Additional details

Show code
bpIntersect = bpPred[bpPred$exon_id %in% exnIntersectionIDs]
bpIntersect$nBps2 = ifelse(bpIntersect$nBps > 4, 4, bpIntersect$nBps)
bpList = split(bpIntersect, bpIntersect$nBps2)

d = lapply(bpList, function(x){
  currExns = x$exon_id
  d = makeCoverageAndCompare(x = clipData$bdsSF3B1_WT, y = clipData$bdsSF3B1_MUT,
                   Xname = "SF3B1-WT", Yname = "SF3B1-MUT", w = 100,
                   rngSs3 = subset(ss3Intersect, names(ss3Intersect) %in% currExns),
                   rngSs5 = subset(ss5Intersect, names(ss5Intersect) %in% currExns),
                   rngBp = subset(bpIntersect, exon_id %in% currExns))
  d$dfTest$sig = ifelse(d$dfTest$pAdj < 0.01, TRUE, FALSE)
  d$dfTest$type = factor(d$dfTest$type, levels = c("BP", "3'SS", "5'SS"))
  d$dfCov$type = factor(d$dfCov$type, levels = c("BP", "3'SS", "5'SS"))
  
  return(d)  
})
dfCov1 = d$`1`$dfCov
dfCov1$var = 1
dfCov2 = d$`2`$dfCov
dfCov2$var = 2
dfCov3 = d$`3`$dfCov
dfCov3$var = 3
dfCov4 = d$`4`$dfCov
dfCov4$var = 4
dfCov = rbind(dfCov1, dfCov2, dfCov3, dfCov4)

dfTest1 = d$`1`$dfTest
dfTest1$var = 1
dfTest2 = d$`2`$dfTest
dfTest2$var = 2
dfTest3 = d$`3`$dfTest
dfTest3$var = 3
dfTest4 = d$`4`$dfTest
dfTest4$var = 4
dfTest = rbind(dfTest1, dfTest2, dfTest3, dfTest4)

dfCovSub = dfCov %>% filter(pos %in% c(-100:50) & type == "3'SS" | pos %in% c(-50:100) & type == "5'SS" | pos %in% c(-50:50) & type == "BP")
dfTestSub = dfTest %>% filter(pos %in% c(-100:50) & type == "3'SS" | pos %in% c(-50:100) & type == "5'SS" | pos %in% c(-50:50) & type == "BP")


ggplot() +
  geom_line(data = dfCovSub, aes(x = pos, y = mean, color = data)) +
  scale_color_npg() +
  ggnewscale::new_scale_color() +
  geom_point(data = subset(dfTestSub, sig == FALSE), aes(x = pos, y = -.05, color = sig), size = 4, shape = 73, stroke = 3) +
  geom_point(data = subset(dfTestSub, sig == TRUE), aes(x = pos, y = -.01, color = sig), size = 4, shape = 73, stroke = 3) +
  scale_color_brewer(palette = "Dark2", direction = -1) +
  facet_grid(var~type, scales = "free") +
  theme_nice() +
  theme(legend.position = "top") +
  labs(
    x = "Position relative to genomic landmark",
    y = "Crosslinks (mean of means)"
  )

Coverage profiles comparisson of SF3B1 WT and MUT signal, split by the number of significant branchpoint predictions.

6 Session Information

Show code
sessionInfo()
R version 4.2.1 (2022-06-23)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Big Sur ... 10.16

Matrix products: default
BLAS:   /Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRblas.0.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats4    grid      stats     graphics  grDevices utils     datasets 
[8] methods   base     

other attached packages:
 [1] BSgenome.Hsapiens.UCSC.hg38_1.4.4 BSgenome_1.65.2                  
 [3] branchpointer_1.23.0              caret_6.0-94                     
 [5] lattice_0.21-8                    ggVennDiagram_1.2.3              
 [7] BindingSiteFinder_1.7.8           kableExtra_1.3.4                 
 [9] ComplexHeatmap_2.14.0             tidyr_1.3.0                      
[11] dplyr_1.1.2                       tibble_3.2.1                     
[13] viridis_0.6.3                     viridisLite_0.4.2                
[15] GenomicAlignments_1.33.1          Rsamtools_2.13.4                 
[17] Biostrings_2.65.6                 XVector_0.37.1                   
[19] SummarizedExperiment_1.27.3       MatrixGenerics_1.9.1             
[21] matrixStats_1.0.0                 GenomicFeatures_1.49.7           
[23] AnnotationDbi_1.59.1              Biobase_2.57.1                   
[25] rtracklayer_1.57.0                GenomicRanges_1.49.1             
[27] GenomeInfoDb_1.33.10              IRanges_2.31.2                   
[29] S4Vectors_0.35.4                  BiocGenerics_0.43.4              
[31] ggplot2_3.4.2                     reshape2_1.4.4                   
[33] scales_1.2.1                      gridExtra_2.3                    
[35] gridGraphics_0.5-1                knitr_1.43                       
[37] ggnewscale_0.4.9                  ggsci_3.0.0                      
[39] patchwork_1.1.2                   circlize_0.4.15                  
[41] readr_2.1.4                      

loaded via a namespace (and not attached):
  [1] utf8_1.2.3             tidyselect_1.2.0       RSQLite_2.3.1         
  [4] htmlwidgets_1.6.2      BiocParallel_1.31.13   pROC_1.18.2           
  [7] munsell_0.5.0          codetools_0.2-19       units_0.8-4           
 [10] future_1.32.0          withr_2.5.0            colorspace_2.1-0      
 [13] filelock_1.0.2         rstudioapi_0.14        listenv_0.9.0         
 [16] labeling_0.4.2         GenomeInfoDbData_1.2.9 polyclip_1.10-4       
 [19] bit64_4.0.5            farver_2.1.1           parallelly_1.36.0     
 [22] vctrs_0.6.3            generics_0.1.3         ipred_0.9-14          
 [25] xfun_0.39              timechange_0.2.0       BiocFileCache_2.5.2   
 [28] R6_2.5.1               doParallel_1.0.17      clue_0.3-64           
 [31] RVenn_1.1.0            bitops_1.0-7           cachem_1.0.8          
 [34] DelayedArray_0.23.2    BiocIO_1.7.1           nnet_7.3-19           
 [37] gtable_0.3.3           globals_0.16.2         timeDate_4022.108     
 [40] rlang_1.1.1            systemfonts_1.0.4      GlobalOptions_0.1.2   
 [43] splines_4.2.1          ModelMetrics_1.2.2.2   yaml_2.3.7            
 [46] tools_4.2.1            lava_1.7.2.1           RColorBrewer_1.1-3    
 [49] proxy_0.4-27           Rcpp_1.0.10            plyr_1.8.8            
 [52] progress_1.2.2         zlibbioc_1.43.0        classInt_0.4-10       
 [55] purrr_1.0.1            RCurl_1.98-1.12        prettyunits_1.1.1     
 [58] rpart_4.1.19           GetoptLong_1.0.5       cowplot_1.1.1         
 [61] cluster_2.1.4          magrittr_2.0.3         data.table_1.14.8     
 [64] ggdist_3.3.0           hms_1.1.3              evaluate_0.21         
 [67] XML_3.99-0.14          shape_1.4.6            compiler_4.2.1        
 [70] biomaRt_2.53.3         KernSmooth_2.23-21     crayon_1.5.2          
 [73] htmltools_0.5.5        tzdb_0.4.0             lubridate_1.9.2       
 [76] DBI_1.1.3              tweenr_2.0.2           dbplyr_2.3.2          
 [79] MASS_7.3-60            rappdirs_0.3.3         sf_1.0-14             
 [82] Matrix_1.5-4.1         cli_3.6.1              parallel_4.2.1        
 [85] gower_1.0.1            pkgconfig_2.0.3        recipes_1.0.6         
 [88] xml2_1.3.4             foreach_1.5.2          svglite_2.1.1         
 [91] hardhat_1.3.0          webshot_0.5.4          prodlim_2023.03.31    
 [94] rvest_1.0.3            stringr_1.5.0          distributional_0.3.2  
 [97] digest_0.6.31          rmarkdown_2.22         restfulr_0.0.15       
[100] curl_5.0.1             kernlab_0.9-32         rjson_0.2.21          
[103] lifecycle_1.0.3        nlme_3.1-162           jsonlite_1.8.5        
[106] fansi_1.0.4            pillar_1.9.0           KEGGREST_1.37.3       
[109] fastmap_1.1.1          httr_1.4.6             survival_3.5-5        
[112] glue_1.6.2             gbm_2.1.8.1            png_0.1-8             
[115] iterators_1.0.14       bit_4.0.5              ggforce_0.4.1         
[118] class_7.3-22           stringi_1.7.12         blob_1.2.4            
[121] memoise_2.0.1          e1071_1.7-13           future.apply_1.11.0